package br.com.foxinline.servico;

import br.com.foxinline.generico.ServicoGenerico;
import br.com.foxinline.modelo.Setor;
import java.beans.Transient;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author laverson
 */
@Stateless
public class SetorServico extends ServicoGenerico<Setor> {

    private Long quantidadeRegistrosResults;

    public SetorServico() {
        super(Setor.class);
    }

    public List<Setor> autoComplete(String query) {
        return findByName(query);
    }

    public List<Setor> findByName(String query) {
        List<Setor> results = getEntityManager().createQuery("select e from " + Setor.class.getSimpleName() + " e where e.numero = " + query.trim()).getResultList();
        return results;
    }

    @Override
    public List<Setor> findAll() {
        return getEntityManager().createQuery("select s from " + Setor.class.getSimpleName() + " s WHERE s.ativo = true").getResultList();
    }

    public List<Setor> autocomplete(String numero) {
        List<Setor> results = null;
        String sql = "SELECT s FROM Setor s WHERE s.numero = :numero order by s.id";
        Query query = getEntityManager().createQuery(sql).setMaxResults(50);

        if (numero != null && !numero.isEmpty()) {
            query.setParameter("numero", Integer.parseInt(numero));
            results = query.getResultList();
        }

        if (results == null || results.isEmpty()) {
            return new ArrayList<Setor>();
        }

        return results;
    }

    @Override
    public List<Setor> find(Setor entidade, Integer first, Integer pageSize) {
        String select = "SELECT s ";
        String sql = "FROM " + Setor.class.getSimpleName() + " s ";
        String orderBy = "ORDER BY s.numero ASC";

        sql += " WHERE ";

        if (entidade.getNumero() != null) {
            sql += "s.numero = :numero AND ";
        }

        sql += "s.ativo = TRUE ";

        Query query = getEntityManager().createQuery(select.concat(sql).concat(orderBy));

        setQuantidadeRegistros(sql, entidade, query);

        setParameters(entidade, query);

        if (first != null && pageSize != null) {
            query.setFirstResult(first).setMaxResults(pageSize);
        }

        return query.getResultList();
    }

    @Transient
    private void setParameters(Setor entidade, Query query) {
        if (entidade.getNumero() != null) {
            query.setParameter("numero", entidade.getNumero());
        }
    }

    private void setQuantidadeRegistros(String sql, Setor entidade, Query query) {

        String select = "SELECT count(s) ";

        query = getEntityManager().createQuery(select + sql);

        setParameters(entidade, query);

        quantidadeRegistrosResults = (Long) query.getSingleResult();
    }

    @Override
    public Long quantidadeRegistros() {
        return quantidadeRegistrosResults;
    }
}
